# -*- coding: utf-8 -*-
# @Time    : 2024/7/1 16:47
# @Author  : yujiahao
# @File    : 17_numpy_io.py
# @description:NumPy IO操作

"""
NumPy IO 操作

NumPy IO 操作是以文件的形式从磁盘中加载 ndarray 对象。在这个过程中，NumPy 可以处理两种文件类型的 ndarray 对象，一类是二进制文件（以 .npy 结尾），另一类是普通文本文件。

上述两种文件格式，分别对应着不同的 IO 方法，如下所示：

NumPy IO 操作方法
文件类型      处理方法
二进制文件    load() 和 save()
普通文本文件  loadtxt() 和 savetxt()

我们知道，文件会被保存在不同的计算机上（比如 Linux、Windows、MacOSX 等）。为了不受计算机架构的影响，NumPy 开发团队给 ndarray 对象引入了一种 .npy 文件格式，通过它来实现对 ndarray 对象的保存。
"""
import numpy as np


# todo 1、二进制文件
def numpy_save(file_path):
    """
    NumPy IO 操作方法

    numpy.save()
    numpy.save() 方法将输入数组存储在 .npy 文件中。
    numpy.save(file, arr, allow_pickle=True, fix_imports=True)

    参数说明：
    file：保存后的文件名称，其文件类型为 .npy；
    arr：要保存的数组；
    allow_pickle：可选项，布尔值参数，允许使用 pickle 序列化保存数组对象；
    fix_imports：可选项，为了便于在 Python 2 版本中读取 Python 3 保存的数据。
    """

    a = np.array([1, 2, 3, 4, 5])
    np.save(file_path, a)

    # 使用 load() 从 first.npy 文件中加载数据，如下所示：

    b = np.load(file_path)
    print(b)


# todo 2、普通文本文件
def numpy_savetxt(file_path):
    """
    savetxt()
    savetxt() 和 loadtxt() 分别表示以文本格式存储数据或加载数据。其中 savetxt() 的语法格式如下：
    np.savetxt('filename文件路径', arr, fmt="%d", delimiter=" ")

    参数说明：
    filename：表示保存文件的路径；
    arr：要保存数组的变量名；
    fmt="%d"：指定保存文件的格式，默认是十进制；
    delimiter=" "：表示分隔符，默认以空格的形式隔开。
    """

    a = np.array([1, 2, 3, 4, 5])
    np.savetxt(file_path, a)

    # 使用 loadtxt() 重新加载数据
    b = np.loadtxt(file_path)
    print(b)


def main():
    file_path_1 = '../../../output/numpy_data_1.npy'
    file_path_2 = '../../../output/numpy_data_2.npy'
    # 保存二进制格式文件
    numpy_save(file_path_1)
    # 保存文本格式文件
    numpy_savetxt(file_path_2)


if __name__ == '__main__':
    main()
